home *** CD-ROM | disk | FTP | other *** search
/ Multimedia Jumpstart / Multimedia Microsoft Jumpstart Version 1.1a (Microsoft).BIN / develpmt / drivers / mscdex / hitachi / ecc.asm < prev    next >
Encoding:
Assembly Source File  |  1990-10-15  |  13.1 KB  |  329 lines

  1.         PAGE    ,132
  2.         TITLE   CD-ROM Error Corect routine for IBM PC
  3.         NAME    ECC
  4. ; ***************************************************************************
  5. ; *                                                                         *
  6. ; * Hitachi CDR-3600/1600S C D - R O M Device Driver                        *
  7. ; * Copyright reserved by Hitachi, Ltd.                                     *
  8. ; *                                                                         *
  9. ; * ECC version MOD21.                                                      *
  10. ; *                                                                         *
  11. ; * This is module corrects errors the drive was not able to.               *
  12. ; *                                                                         *
  13. ; *                                                                         *
  14. ; * History:                                                                *
  15. ; *                                                                         *
  16. ; * Created.                                                                *
  17. ; *     Oct. 07,1985 -by- H. ONO                                            *
  18. ; * Modified.                                                               *
  19. ; *     Mar. 30,1989 -by- T.ENOKI                                           *
  20. ; * Modified (v2.20)                                                        *
  21. ; *     10/1/90 -by- JohnYG                                                 *
  22. ; *     Final Release (v2.20)                                               *
  23. ; *                                                                         *
  24. ; ***************************************************************************
  25. ;------------------------------------------------------
  26. ;       N E A R   T Y P E
  27. ;------------------------------------------------------
  28. _TEXT   SEGMENT BYTE PUBLIC 'CODE'
  29.         ASSUME  CS:_TEXT,ES:_TEXT,DS:_TEXT
  30.         EXTRN   BUF:BYTE
  31.         PUBLIC  ECC
  32. ECC     PROC    NEAR
  33.         JMP     short START_ECC
  34.         NOP
  35. INIT_MES        DB      " ECCMOD21 "
  36. ;----------------------------------------------------------------------
  37. ; W O R K   A R E A 
  38. ;---------------------------------------------------------------------
  39. ; ECC DECODER
  40. ;
  41. PQ_KAISU        DB      4               ;P,Q PARITY HOSEI LOOP KAISU
  42. P_OK            DW      0FFFFH          ;P PARITY ERROR FLAG
  43. Q_OK            DW      0FFFFH          ;Q PARITY ERROR FLAG
  44. P_NO            DW      0               ;P PARITY CHECK NO
  45. Q_NO            DW      0               ;Q PARITY CHECK NO
  46. S0              DB      0               ;S0 SYNDOROME
  47. S1              DB      0               ;S1 SYNDOROME
  48. E_OK            DB      0               ;EVEN OK FLAG
  49. O_OK            DB      0               ;ODD OK FLAG
  50. W_DATA_AD_OFF   DW      0               ;DATA BLOCK START ADDRESS
  51. ;;;;W_DATA_AD_SEG       DW      0               ;  "    "     "      "
  52. SI_SAVE         DW      0               ;Q0 CODE  START ADDRESS
  53. TMAT_FLAG       DB      0               ;0 -- NO INITIALIZE  1 -- ALREADY DONE
  54. ;----------------------------------------------------------------------
  55. ; E C C   D E C O D E    R O U T I N E
  56. ;----------------------------------------------------------------------
  57. START_ECC:
  58.         CLD
  59.         PUSH    DS                      ;SAVE   -- EDIT 4/10/'86
  60.         PUSH    ES
  61.         PUSH    CS
  62.         POP     DS                      ;DS <- CS
  63.         PUSH    CS
  64.         POP     ES                      ;ES <- CS
  65.         CMP     TMAT_FLAG,0
  66.         JNE     ECC_ST_1
  67.         CALL    T_MAT_MAKE              ;T_MATRIX SARCH TABLE MAKE
  68.         MOV     TMAT_FLAG,1
  69. ECC_ST_1:
  70.         MOV     W_DATA_AD_OFF,OFFSET BUF        ;EVEN AREA START ADDRESS SET
  71. ;;;     MOV     W_DATA_AD_SEG,SEG BUF   ;
  72. ;;;     MOV     ES,W_DATA_AD_SEG                ;
  73.         CALL    HALF                    ;EVEN REGION HOSEI
  74.         JC      ECC_END                 ;
  75.         INC     W_DATA_AD_OFF           ;ODD AREA START ADDRESS SET
  76.         CALL    HALF                    ;ODD REGION HOSEI
  77. ECC_END:
  78.         POP     ES
  79.         POP     DS                      ;RESTORE-- EDIT 4/10/'86
  80.         RET
  81. ;----------------------------------------------------------------------
  82. ; R O C A L   P R O C E D U R E 
  83. ;----------------------------------------------------------------------
  84. ROPRO   PROC    NEAR
  85. ;----------------------------------------------------------------------
  86. ; HALF
  87. ;
  88. HALF:   MOV     PQ_KAISU,4              ;P,Q PARITY HOSEI KAISU
  89.         MOV     Q_OK,0FFFFH             ;Q_OK = 0FFFFH
  90. HAL_1:
  91.         MOV     P_OK,0                  ;P_OK = 0
  92.         MOV     CX,43                   ;LOOP KAISU = 43
  93. HAL_2:
  94.         PUSH    CX
  95.         DEC     CX                      ;P_NO = LOOP COUNT - 1 (42 - 0)
  96.         MOV     P_NO,CX                 ;P_NO SET
  97.         CALL    P_                      ;P_PARITY HOSEI
  98.         POP     CX
  99.         LOOP    HAL_2
  100.         TEST    P_OK,0FFFFH             ;IF P_PARITY HOSEI NG -> Q_PARITY HOSEI
  101.         JNZ     HAL_3
  102.         TEST    Q_OK,0FFFFH
  103.         JZ      OK_END                  ;P,Q PARITY HOSEI OK -> OK_END
  104. HAL_3:
  105.         MOV     Q_OK,0                  ;Q_OK = 0
  106.         MOV     CX,26                   ;LOOP KAISU = 26
  107. HAL_4:
  108.         PUSH    CX
  109.         DEC     CX                      ;Q_NO = LOOP COUNT - 1 ( 25 - 0 )
  110.         MOV     Q_NO,CX                 ;Q_NO SET
  111.         CALL    Q_                      ;Q_PARITY HOSEI
  112.         POP     CX
  113.         LOOP    HAL_4
  114.         TEST    Q_OK,0FFFFH
  115.         JNZ     HAL_5                   ;IF Q_PARITY HOSEI NG -> P_PARITY HOSEI
  116.         TEST    P_OK,0FFFFH
  117.         JNZ     HAL_5
  118. OK_END:                                 ;P,Q PARITY HOSEI OK -> CY=0
  119.         CLC
  120.         RET                             ;CORECTION COMPLETE
  121. HAL_5:
  122.         DEC     PQ_KAISU                ;P,Q PARITY HOSEI KAISU END?
  123.         JNZ     HAL_1
  124.         STC                             ;P,Q PARITY HOSEI NG CY=1
  125.         RET
  126. ;------------------------------------------------------------------
  127. P_:                                     ;P_PARITY CHECK
  128.         MOV     SI,W_DATA_AD_OFF                ;SI<- INITIAL ADDRESS
  129.         ADD     SI,P_NO
  130.         ADD     SI,P_NO                 ;SI<- SI+2*P_NO
  131.         MOV     CX,25                   ;LOOP KAISU =25 W(0),--,W(23),P0,P1
  132.         MOV     AH,[SI]         ;AH <- W(0)
  133. P_12:
  134.         ROL     AH,1                    ;1BIT LEFT ROTATE SHIFT
  135.         JNC     P_13
  136.         XOR     AH,1CH                  ;AH=T*W(i)
  137. P_13:
  138.         ADD     SI,43*2
  139.         XOR     AH,[SI]         ;AH=T*W(i) EOR W(i+1)     P0,P1
  140.         LOOP    P_12
  141.         MOV     S1,AH                   ;S1 SYNDOROME
  142. ;
  143.         MOV     SI,W_DATA_AD_OFF                ;SI <- INITIAL ADDRESS
  144.         ADD     SI,WORD PTR P_NO
  145.         ADD     SI,WORD PTR P_NO        ;SI <- SI+2*P_NO
  146.         MOV     AH,[SI]         ;AH=W(0)
  147.         MOV     CX,25                   ;LOOP KAISU = 25  W(0),--,W(23),P0,P1
  148. P_5:
  149.         ADD     SI,43*2                 ;SI <- SI+43*2
  150.         MOV     AL,[SI]         ;
  151.         XOR     AH,AL                   ;AH = W(i) EOR W(i+1)     P0,P1
  152.         LOOP    P_5
  153.         MOV     S0,AH                   ;S0 SYNDOROME
  154.         JNZ     P_55                    ;IF S1<>0 GOTO HOSEI ROUTINE
  155.         TEST    S1,0FFH                 ; 
  156.         JZ      RET_0                   ;IF S1=0 RETURN
  157. P_54:   ADD     WORD PTR P_OK,100H      ;P_OK <- P_OK + 100H    HOSEI NG
  158. RET_0:  RET                             ;
  159. P_55:
  160.         TEST    S1,0FFH                 ;IF S1=0 HOSEI NG ( S0<>0 )
  161.         JZ      P_54
  162. ;
  163. P_6:
  164.         CALL    T_SARCH                 ;T_MATRIX NO SARCH
  165.         MOV     SI,W_DATA_AD_OFF                ;SI <- INITIAL ADDRESS SET
  166.         ADD     SI,P_NO
  167.         ADD     SI,P_NO                 ;SI<- SI+2*P_NO
  168.         ADD     CL,25                   ;CL <- CL+25
  169.         JE      P_66
  170.         CMP     CL,25                   ; 0 - 25   ->  26 data
  171.         JA      P_54                    ;IF CL > 25 HOSEI NG
  172. P_65:                                   ;HOSEI SURU DATA NO ADDRESS SARCH
  173.         ADD     SI,43*2                 ;SI <- SI+2*43
  174.         LOOP    P_65                    ;
  175. P_66:   MOV     AL,S0                   ;
  176.         XOR     [SI],AL         ;1 BYTE HOSEI END
  177. P_ECC_RET:
  178.         INC     P_OK                    ;P_PARITY HOSEI KAISU INCREMENT
  179.         RET
  180. ;-----------------------------------------------------------------
  181. Q_:                                     ;Q PARITY CHECK
  182.         CALL    Q_NO_ST                 ;Q PARITY START ADDRESS SET
  183.         MOV     CX,42                   ;LOOP KAISU = 42  W(0),--,W(42)
  184. Q_12:
  185.         ROL     AH,1                    ;1 BIT LEFT ROTATE SHIFT
  186.         JNC     Q_14
  187.         XOR     AH,1CH                  ;AH <- T*W(i)
  188. Q_14:
  189.         ADD     SI,44*2                 ;NEXT SI ADDRESS SET
  190.         CMP     SI,1118*2+OFFSET BUF    ;ORIKAESI CHECK
  191.         JB      Q_16                    ;IF ORIKAESI   SI <-  SI-2*1118
  192.         SUB     SI,1118*2
  193. Q_16:
  194.         XOR     AH,[SI]         ;AH = W(i) EOR W(i+1)
  195.         LOOP    Q_12
  196.         ROL     AH,1
  197.         JNC     Q_17
  198.         XOR     AH,1CH                  ;AH <- T*AH
  199. Q_17:
  200.         MOV     SI,W_DATA_AD_OFF                ;SI <- INITIAL ADDRESS SET
  201.         ADD     SI,Q_NO
  202.         ADD     SI,Q_NO                 ;SI <- SI+2*Q_NO
  203.         ADD     SI,1118*2               ;SI <- SI+2*1118
  204.         MOV     SI_SAVE,SI              ;Q0 CODE  START ADDRESS SAVE
  205.         XOR     AH,[SI]         ;AH=AH EOR Q0
  206.         ROL     AH,1
  207.         JNC     Q_18                    ;AH = T * AH
  208.         XOR     AH,1CH
  209. Q_18:
  210.         ADD     SI,26*2                 ;SI <- SI+2*26
  211.         XOR     AH,[SI]         ;AH <- AH EOR Q1
  212.         MOV     S1,AH                   ;S1 SYNDOROME
  213.         CALL    Q_NO_ST                 ;Q_PARITY START ADDRESS SET
  214.         MOV     CX,42                   ;LOOP KAISU = 42   W(0),--,W(42)
  215. Q_7:
  216.         ADD     SI,44*2                 ;NEXT SI ADDRESS SET
  217.         CMP     SI,1118*2+OFFSET BUF    ;ORIKAESI CHECK  O.K.?
  218.         JB      Q_8
  219.         SUB     SI,1118*2               ;IF ORIKAESI  SI <- SI -2*1118
  220. Q_8:
  221.         XOR     AH,[SI]         ;AH = W(i) EOR W(i+1)
  222.         LOOP    Q_7
  223.         MOV     SI,SI_SAVE              ;Q0 CODE  START ADDRESS SET
  224.         XOR     AH,[SI]         ;AH <- AH EOR Q0
  225.         ADD     SI,26*2
  226.         XOR     AH,[SI]         ;AH <- AH EOR Q1
  227.         MOV     S0,AH                   ;S0 SYNDOROME
  228.         JNZ     Q_55                    ;IF S0<>0 GO TO HOSEI ROUTINE
  229.         TEST    S1,0FFH
  230.         JZ      RET_2                   ;IF S1=0 RETURN
  231. Q_54:   ADD WORD PTR Q_OK,100H          ;HOSEI NG
  232. RET_2:  RET
  233. Q_55:
  234.         TEST    S1,0FFH                 ;IF S1=0 HOSEI NG ( S0<>0 )
  235.         JZ      Q_54
  236. ;
  237. Q_ECC:
  238.         CALL    T_SARCH                 ;T_MATRIX NO SARCH
  239.         MOV SI,W_DATA_AD_OFF        ;SI <- INITIAL ADDRESS SET
  240.     ADD    CL,44            ;CL <- CL+44
  241.     JE    Q_ECC_3            ;CL=0
  242.     CMP    CL,44            ;IF CL > 44  HOSEI NG
  243.     JA    Q_ECC_NG
  244.     CMP    CL,42            ;IF  CL = 43,44  Q0,Q1 HOSEI
  245.     JA    Q_ECC_5
  246. Q_ECC_3:
  247.     XOR    AH,AH            ;AH=0
  248.     PUSH    CX
  249.     CALL    Q_NO_ST            ;Q_PARITY START ADDRESS SET
  250.     POP    CX
  251.     OR    CL,CL            ;CL = 0 ?
  252.     JZ    Q_ECC_8            ;IF CL = 0  W(0) HOSEI
  253. Q_ECC_44:
  254.     ADD    SI,44*2            ;SI <- SI+2*44
  255.     CMP    SI,1118*2+OFFSET BUF    ;ORIKAESI CHECK
  256.     JB    Q_ECC_46    
  257.     SUB    SI,1118*2        ;IF ORIKAESI SI <-  SI-2*1118
  258. Q_ECC_46:
  259.     LOOP    Q_ECC_44
  260. Q_ECC_8:    MOV    AL,S0
  261.     XOR    [SI],AL        ;1 BYTE HOSEI END
  262. Q_ECC_RET:
  263.     INC    Q_OK            ;Q_PARITY HOSEI KAISU INCREMENT
  264.     RET
  265. Q_ECC_NG:    ADD    Q_OK,100H    ;Q_PARITY HOSEI NG  Q_OK <- Q_OK+100H
  266.     RET
  267. Q_ECC_5:                ;Q0 , Q1 HOSEI
  268.     MOV    SI,SI_SAVE        ;Q0  CODE START ADDRESS SET
  269.     SUB    CL,43            ;CL <- CL-43
  270.     JZ    Q_ECC_8            ;IF CL=0 Q0 HOSEI
  271.     ADD    SI,26*2            ;SI <- SI+2*26  Q1 HOSEI
  272.     JMP    Q_ECC_8
  273. ;--------------------------------------------------------------------
  274. T_MAT_MAKE:
  275.     CLD
  276.     MOV    DI,OFFSET T_MAT_TBL    ;DI <- T_MARIX START ADDRESS SET
  277.     MOV    CX,255            ;T**255 = 1  -> T(1)
  278.     XOR    BH,BH            ;BH=0
  279.     MOV    AL,1
  280.     CALL    STOS_B
  281.     DEC    CX            ;LOOP KAISU = 254
  282. NEXT:
  283.     ROL    AL,1
  284.     JNC    NEXT_1            ;AL <- T*AL
  285.     XOR    AL,1CH
  286. NEXT_1:
  287.     CALL    STOS_B
  288.     LOOP    NEXT
  289.     RET
  290. ;------------------------------------------------------------
  291. STOS_B:
  292.     MOV    DX,255
  293.     SUB    DX,CX            ;T*(255-CX) -> T(255-CX)
  294.     MOV    BL,AL
  295.     MOV    [DI+BX],DL
  296.     RET
  297. ;---------------------------------------------------------------
  298. Q_NO_ST:                ;Q PARITY CHECK START ADDRESS
  299.     MOV    SI,W_DATA_AD_OFF        ;SI=INITIAL START ADDRESS
  300.     MOV    CX,Q_NO            ;LOOP KAISU = Q_NO
  301.     OR    CL,CL            ;CL= 0 ?
  302.     JZ    Q_NO_ST_2        ;IF CL=0  SI= Q PARITY START ADDRESS
  303. Q_NO_ST_1:    ADD    SI,43*2        ;SI<- SI+43*2
  304.     LOOP    Q_NO_ST_1        ;
  305. Q_NO_ST_2:    MOV    AH,[SI]    ;AH=START DATA
  306.     RET
  307. ;-------------------------------------------------------------------
  308. T_SARCH:                ;T MATRIX NO SARCH
  309.     MOV    DI,OFFSET T_MAT_TBL    ;
  310.     XOR    BH,BH            ;BH=0
  311.     MOV    BL,S0
  312.     MOV    CL,[DI+BX]        ;CL <- S0 T_MATRIX_NO
  313.     MOV    BL,S1
  314.     SUB    CL,[DI+BX]        ;CL<- S0 T_MATRIX_NO - S1 T_MATRIX_NO
  315.     JBE    RET_4
  316.     INC    CL            ;IF CL>0  CL <- CL+1
  317. RET_4:            ;POP    ES            ;RESTORE ES
  318.     RET
  319. ;
  320. T_MAT_TBL    DB    (256+8) DUP (?)
  321. ;----------------------------------------------------------------------
  322. ;----------------------------------------------------------------------
  323. ROPRO    ENDP
  324. E_O_P:
  325. ECC    ENDP
  326. _TEXT    ENDS
  327.     END
  328. 
  329.